/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;

import Motor.ClaseUtilitaria;
import Motor.Cliente;
import Motor.Factura;
import Motor.Oferta;
import Motor.Producto;
import Motor.TarjetaDeAfiliado;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

//import java.text.ParseException;
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.List;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.output.XMLOutputter;

/**
 *
 * @author Davielis
 */


public class DAOOfertaXML
{

    /** variable que contiene la raiz del documento Xml*/
    private Element root;
    /** variable que contiene la localizacion del archivo xml*/
	private String fileLocation = "src//archivo//Ofertas.xml";

//    /**
//     * constructor por defecto que inicia los valores para trabajar con el documento
//     * xml
//     */
   public DAOOfertaXML()
		   //throws IOException
   {
        try
		{
            SAXBuilder builder = new SAXBuilder(false);
            Document doc = null;
            doc = builder.build(fileLocation);
            root = doc.getRootElement();
        } catch (JDOMException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
    }

/*Aqui lleno todo el contexto que le voy a insertar al archivo, es decir
    el nodo principal que es Cliente con los atributos que le corresponden,
    los cuales seria cedula,nombre y apellido,etc*/

    public Element OfertatoXmlElement(Oferta oferta) throws IOException
	{

        Element raizOferta = new Element("oferta");

//private Date fechaInicioOferta;
//	private Date fechaFinOferta;

		Element fechaInicioOferta = new Element("fechaInicioOferta");
	//	System.out.println("Oferta: " + oferta.getFechaInicioOferta().toString());
		
		try
		{

		    fechaInicioOferta.setText(ClaseUtilitaria.convertiDateString(oferta.getFechaInicioOferta()));

		} 
		catch (ParseException ex)
		{

		}

		Element fechaFinOferta = new Element("fechaFinOferta");
			try {
				fechaFinOferta.setText(ClaseUtilitaria.convertiDateString(oferta.getFechaFinOferta()));
			} catch (ParseException ex1) {
			}

      
	raizOferta.addContent(fechaInicioOferta);
	raizOferta.addContent(fechaFinOferta);
	
	

//
//        if (paciente.getPlanPaciente() != null){
//            DAOPlanXML tempPlan = new DAOPlanXML();
//            raizPaciente.addContent(tempPlan.PlantoXmlElement(paciente.getPlanPaciente()));
//        }
//
//        if (paciente.getCitaMedica() != null){
//            DAOCitaXML tempCita = new DAOCitaXML();
//            Iterator i = (paciente.getCitaMedica()).iterator();
//            while (i.hasNext()){
//                raizPaciente.addContent(tempCita.CitatoXmlElement((Cita) i.next()));
//            }
//        }
///
	return raizOferta;
  }
//
//   /*Método que retorna un Cliente. A este metodo se le manda un Element y con
//    sus datos se hará los pasos requeridos para crear el Cliente*/


	public Oferta OfertaToObject (Element element) throws ParseException
	{
		Oferta nuevaOferta = new Oferta();
		//DAOTarjetaDeAfiliadoXML tarj = new DAOTarjetaDeAfiliadoXML();

//private Date fechaInicioOferta;
//	private Date fechaFinOferta;

		String fechaInicioOferta = element.getChildText("fechaInicioOferta");
		nuevaOferta.setFechaInicioOferta(ClaseUtilitaria.convertirStringaDate(fechaInicioOferta) );

		String fechaFinOferta = element.getChildText("fechaFinOferta");
		nuevaOferta.setFechaFinOferta(ClaseUtilitaria.convertirStringaDate(fechaFinOferta) );


		return nuevaOferta;
	}

//    {
//        Paciente nuevoPaciente = new Paciente();
//	nuevoPaciente.setNombreCompleto(element.getChildText("nombre"));
//        nuevoPaciente.setCedula(Integer.parseInt(element.getChildText("cedula")));
//        String st = (element.getChildText("fechanacimiento"));
//        HoraFecha hf = new HoraFecha(st.split("/"));
//        nuevoPaciente.setFechaNacimiento(hf);
//        nuevoPaciente.setUsuario(element.getChildText("usuario"));
//        nuevoPaciente.setContrasena(element.getChildText("contrasena"));
//        nuevoPaciente.setResidencia(element.getChildText("residencia"));
//        nuevoPaciente.setTelefono(element.getChildText("telefono"));
//        nuevoPaciente.setCuentaActiva(Boolean.parseBoolean(element.getChildText("cuentaactiva")));
////
//        DAOCitaXML tempCita = new DAOCitaXML();
//
//        for (Object it : element.getChildren("cita")) {
//            Element xmlElem = (Element) it;
//            try {
//                nuevoPaciente.agregarCitaMedica(tempCita.CitaToObject(xmlElem));
//            } catch (ParseException ex) {
//                System.out.println(ex.getMessage());
//            }
//        }
//
//        DAOEntradaSalidaXML entSal = new DAOEntradaSalidaXML();
//
//        for (Object it : element.getChildren("entradasalida")) {
//            Element xmlElem = (Element) it;
//            try {
//                nuevoPaciente.nuevoRegistroES(entSal.EntradaSalidaToObject(xmlElem));
//            } catch (ParseException ex) {
//                System.out.println(ex.getMessage());
//            }
//        }
//        if (element.getChild("historia") != null){
//			if(element.getChild("historia").getText().compareTo("")!=0)
//			{
//				DAOHistoriaXML historia = new DAOHistoriaXML();
//				nuevoPaciente.setHistorialPaciente(historia.HistoriaToObject(element.getChild("historia")));
//
//			}
//	    }
//
//        if (element.getChild("plan") != null){
//            DAOPlanXML plan = new DAOPlanXML();
//            nuevoPaciente.setPlanPaciente(plan.PlanToObject(element.getChild("plan")));
//        }
//
//        return nuevoPaciente;
//    }
//
   /* Operacion para guardar en el documento Xml los cambios efectuados
    * @return true si se cumplio la operacion con exito, false en caso contrario*/

    private boolean updateDocument()
	{
        try {
            XMLOutputter out = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
            FileOutputStream file = new FileOutputStream(fileLocation);
            out.output(root, file);
            file.flush();
            file.close();
            return true;
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
            return false;
        }
    }

   /* Operacion que busca un elemento que cumpla con una condicion en el id del xml
     * @param raiz = raiz del documento xml
     * @param dato = elemento a buscar.
     * @return retorna el elemento si existe con la condicion, en caso contrario retorna null */



    public static Element buscar(List raiz, String dato)
	{
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("cedula").getText()))
			{
                return e;
            }
        }
        return null;
    }


//   //TODO Por adaptar
//   // @return valor boleano con la condicion de exito

	   public boolean agregarOferta(Oferta nOferta) throws IOException
	   {
        boolean resultado = false;
		root.addContent(OfertatoXmlElement((Oferta) nOferta));
        resultado = updateDocument();
        return resultado;
    }

    /* @param cedula numero de cedula del Cliente a buscar
    * @return objeto Cliente con sus datos segun busqueda*/



//	   public Cliente buscarCliente(Integer cedula)
//	{
//        Element aux = new Element("cliente");
//        List Clientes = this.root.getChildren("cliente"); //aca llamo a mis CLIENTES XML  q esta en archivo?
//        while (aux != null)
//		{
//            aux = DAOClienteXML.buscar(Clientes, Integer.toString(cedula));
//            if (aux != null) {
//                try {
//					System.out.println("CLIENTE SI EXISTE");
//                    return ClienteToObject(aux);
//                } catch (ParseException ex) {
//                    System.out.println(ex.getMessage());
//                }
//            }
//        }
//			return null;
//    }


//    /* @param Estudiante objeto Estudiante a actualizar
//     * @return valor boleano con la condicion de exito */

//    public boolean actualizarPaciente(Paciente nPaciente) {
//        boolean resultado = false;
//        Element aux = new Element("paciente");
//        List Pacientes = this.root.getChildren("paciente");
//        while (aux != null) {
//            aux = DAOPacienteXML.buscar(Pacientes, Integer.toString(nPaciente.getCedula()));
//            if (aux != null) {
//                Pacientes.remove(aux);
//                resultado = updateDocument();
//            }
//        }
//        agregarPaciente(nPaciente);
//        return resultado;
//    }
//
//    //TODO Por adaptar
//
    /* @param cedula cedula del Estudiante a borrar
     * @return valor boleano con la condicion de exito  */
//    public boolean borrarCliente(Integer cedula)
//	{
//        boolean resultado = false;
//        Element aux = new Element("cliente");
//        List Clientes = this.root.getChildren("cliente");
//        while (aux != null) {
//            aux = DAOClienteXML.buscar(Clientes, Integer.toString(cedula));
//            if (aux != null) {
//                Clientes.remove(aux);
//                resultado = updateDocument();
//            }
//        }
//        return resultado;
//    }

//    //TODO Por adaptar
//
    /* Para obtener todos los Clientes
     * @return ArrayList con todos los objetos Cliente  */


    public ArrayList<Oferta> todosLasOfertas()
	{
        ArrayList<Oferta> resultado = new ArrayList<Oferta>();
        for (Object it : root.getChildren()) {
            Element xmlElem = (Element) it;
            try {
                resultado.add(OfertaToObject(xmlElem));
            } catch (ParseException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return resultado;
    }
}

